Obsidian TC 日別リスト 2
< Obsidian TC 日別リスト || Obsidian TC 日別リスト 3 >
2024-10-08
タスクリストの文字サイズを落とした
実績が1時間を超える場合、1h21m のように表示されるように変更
日付の折り返しがでないように行幅を調整
https://scrapbox.io/files/6704bb689698c8001cf32a5f.png
code:js
`dataviewjs
// 時間と分のフォーマット関数
function formatTime(minutes) {
let hours = Math.floor(minutes / 60);
let remainingMinutes = minutes % 60;
if (hours > 0) {
return ${hours}h${remainingMinutes}m;
} else {
return ${remainingMinutes}m;
}
}
// 今日の日付を取得
let today = window.moment().startOf('day');
// 過去30日分の日付を取得
let startDate = today.clone().subtract(30, 'days');
// 日別タスクリストと実績時間を格納するオブジェクト
let tasksByDate = {};
// フィルター条件(ここでは例として特定のキーワードに基づいてフィルタリング)
let filterKeyword = "メモ"; // ここにフィルターの条件を設定(例: 特定のキーワード)
let filterEnabled = filterKeyword.length > 0;
// データビュープラグインを利用して過去30日分のタスクを取得
for (let i = 0; i <= 30; i++) {
let currentDate = startDate.clone().add(i, 'days');
let filePath = notes/${currentDate.format('YYYY-MM-DD')}.md; // デイリーノートのパス
let tasksForDay = [];
let totalMinutes = 0;
if (await app.vault.adapter.exists(filePath)) {
let fileContent = await dv.io.load(filePath);
let lines = fileContent.split('\n');
// 各行を確認してタスクと実績時間を抽出
lines.forEach(line => {
let match = line.match(/(\d+)\s*\\\s*(.*)/); // 実績時間とタスク内容を正規表現で抽出
if (match) {
let minutes = parseInt(match1, 10); // 実績時間を数値に変換
let task = match2; // タスク内容
// ()内を削除してリンク部分を省略
task = task.replace(/\[(^\]+)\]\(^\)+\)/g, "$1");
// フィルター条件に一致するタスクのみ表示
if (!filterEnabled || task.includes(filterKeyword)) {
tasksForDay.push(${task} (${formatTime(minutes)}));
totalMinutes += minutes; // 実績時間を足し合わせる
}
}
});
// 日付ごとのタスクリストと実績時間の合計を保存
if (tasksForDay.length > 0) {
tasksByDatecurrentDate.format('YYYY-MM-DD') = {
tasks: tasksForDay,
total: totalMinutes
};
}
}
}
// テーブルのHTMLを生成
let tableHTML = `
<table border="1" style="width: 100%; text-align: left;">
<tr>
<th style="width: 120px;">日付</th>
<th>タスクリスト</th>
<th style="width: 100px;">実績</th>
</tr>
`;
// 日ごとのタスクと実績時間をテーブルに表示
for (const date, data of Object.entries(tasksByDate)) {
tableHTML += `
<tr>
<td>${date}</td>
<td style="font-size: 0.85em;">${data.tasks.join('<br>')}</td>
<td style="text-align: right;">${formatTime(data.total)}</td>
</tr>
`;
}
tableHTML += </table>;
// 結果を表示
dv.container.innerHTML = tableHTML;
`